﻿using System;
using System.Threading;

public class AlarmClock
{
    // 定义事件参数类
    public class AlarmEventArgs : EventArgs
    {
        public DateTime AlarmTime { get; }

        public AlarmEventArgs(DateTime alarmTime)
        {
            AlarmTime = alarmTime;
        }
    }

    // 声明事件
    public event EventHandler Tick;      // 嘀嗒事件
    public event EventHandler<AlarmEventArgs> Alarm;  // 响铃事件

    private Timer _timer;
    private DateTime _alarmTime;

    public AlarmClock()
    {
        // 创建每秒触发一次的定时器
        _timer = new Timer(TimerCallback, null, Timeout.Infinite, 1000);
    }

    // 设置闹钟时间
    public void SetAlarm(DateTime alarmTime)
    {
        _alarmTime = alarmTime;
        Console.WriteLine($"闹钟已设置为 {alarmTime:HH:mm:ss}");
    }

    // 启动闹钟
    public void Start()
    {
        _timer.Change(0, 1000);  // 立即启动，每秒触发
    }

    // 停止闹钟
    public void Stop()
    {
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
    }

    private void TimerCallback(object state)
    {
        var now = DateTime.Now;

        // 触发 Tick 事件
        Tick?.Invoke(this, EventArgs.Empty);

        // 检查是否到达闹钟时间（精确到秒）
        if (now >= _alarmTime && now < _alarmTime.AddSeconds(1))
        {
            // 触发 Alarm 事件
            Alarm?.Invoke(this, new AlarmEventArgs(_alarmTime));
        }
    }
}

class Program
{
    static void Main()
    {
        var alarmClock = new AlarmClock();

        // 订阅事件
        alarmClock.Tick += (sender, e) =>
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 嘀嗒...");

        alarmClock.Alarm += (sender, e) =>
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"\a[{DateTime.Now:HH:mm:ss}] 叮铃铃！！！该起床了！");
            Console.ResetColor();
            ((AlarmClock)sender).Stop();
        };

        // 设置 5 秒后的闹钟
        alarmClock.SetAlarm(DateTime.Now.AddSeconds(5));
        alarmClock.Start();

        Console.WriteLine("闹钟已启动，5 秒后响铃...");
        Thread.Sleep(6000);  // 等待程序运行
    }
}